home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Amiga Collections: Auge 4000
/
Auge 4000 #73 (1993-11-10)(Amiga User Gruppe Einzugsgebiet 4000).zip
/
Auge 4000 #73 (1993-11-10)(Amiga User Gruppe Einzugsgebiet 4000).adf
/
RSysV1.3
/
RSysV1_3.lha
/
RSysSrc.lha
/
RSys.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-09-25
|
23KB
|
970 lines
/*
***************************************************************************
*
* Datei:
* RSys.c
*
* Inhalt:
*
* --- Globale Routinen ---
*
* void About ( void );
* void HandleMainPort ( void );
* void main ( int argc , char **argv );
*
* --- Lokale Routinen ---
*
* static int HandleArguments ( char **str );
* static int position ( int ch );
* static void HandleGadgets ( struct Gadget *gad );
* static void HandleIDPort ( void );
* static void HandleMenu ( ULONG code );
* static void HandleRawKeys ( ULONG code , ULONG qualifier );
* static void HandleVanillaKeys ( ULONG code , ULONG qualifier );
* static void Jump ( void );
* static void SelectGadget ( struct Gadget *Gadget );
* static void SetMainLVTop ( int top );
* static void UnSelectGadget ( struct Gadget *Gadget );
*
* Bemerkungen:
* Hauptprogramm und Handling-Routinen von RSys.
*
* Erstellungsdatum:
* 07-Jan-93 Rolf Böhme
*
* Änderungen:
* 07-Jan-93 Rolf Böhme Erstellung
*
***************************************************************************
*/
#include "RSys.h"
/*#define BETA 1*/
/*
* Der Kennstring, der von dem DOS-Befehl Version
* gefunden wird
*/
const char *v = "\0$VER: " NAME " " VERSION " (" DATE " " TIME ") " COPYRIGHT " \n";
/*
* Die Prozedur About() gibt eine Kurzinformation zum
* Programm RSys aus
*/
void
About(void)
{
UBYTE info[]= (UBYTE *)
"\n»»»»»»»»»»»» " NAME " " VERSION " ««««««««««««\n\n "
" The Program was written by\n\n"
" Rolf Böhme\n"
" Stammestr. 48\n"
" 30459 Hannover 91\n"
" Germany\n"
" Z-NET: R.BOEHME@COPS.ZER\n"
" FIDO: 2:241/37.2 (Rolf Boehme)\n\n"
#ifdef BETA
" !This is a BETA-RELEASE!\n"
" Please do not redistribute!\n"
#endif
" It's placed in Public Domain\n"
" under the terms of Giftware!\n"
"Please send small donations, gifts\n"
" or other little sweeties to me!!\n";
DPOS;
HandleHelp(MN_About);
MyEasyRequest(SysWnd, (UBYTE *) NAME " Info (" DATE ", " TIME ")",
(UBYTE *) "Continue", info);
return;
}
/*
* Die Prozedur Jump() sucht den nächsten
* PublicScreen in der Systemliste, holt ihn nach
* vorn und öffnet auf ihm das RSys-Hauptfenster
*/
static void
Jump(void)
{
struct Screen *NewScr = NULL;
struct List *PSList = NULL;
struct Node *Node = NULL;
extern struct Screen *lastpubscreen;
char savenamebuffer[MAXPUBSCREENNAME + 1];
int openit;
strcpy(savenamebuffer, (char *)namebuffer);
/*
* Sperren der Systemliste aller PubScreens
*/
PSList = LockPubScreenList();
/*
* Aktuellen Knoten finden, also den Screen auf dem sich
* RSys im Moment befindet
*/
Forbid();
Node = FindName(PSList, namebuffer);
Permit();
if (NOT(Node))
{
UnlockPubScreenList();
ErrorHandle((char *)namebuffer, SCREEN_ERR, FIND_FAIL, NO_KILL);
}
else
{
while (Node)
{
/*
* Falls der gefundene PubScreen der letzte im System ist,
* wird dieser gelocked
*/
if (NOT(Node->ln_Succ))
{
Node = PSList->lh_Head;
strcpy((char *)namebuffer, Node->ln_Name);
NewScr = LockPubScreen(namebuffer);
break;
}
else
if (NewScr = LockPubScreen((UBYTE *)Node->ln_Succ->ln_Name))
{
strcpy((char *)namebuffer, Node->ln_Succ->ln_Name);
break;
}
/*
* Falls der Nachfolger-PubScreen nicht gesperrt werden konnte,
* wird der nächste gesucht.
*/
Node = Node->ln_Succ;
}
UnlockPubScreen(NULL, NewScr);
UnlockPubScreenList();
if (NewScr != lastpubscreen)
{
ScreenToFront(NewScr);
CloseASysWindow(&SysWnd, &SysGList, &SysMenus);
CloseDownScreen();
OpenMainWindow();
RefreshList(LastID);
openit = CloseHelpOnScreen();
OpenHelpOnScreen(openit);
ClearIntuiMsgPort(SysWnd);
}
else
{
strcpy((char *)namebuffer, savenamebuffer);
ErrorHandle("No more Public Screens", SCREEN_ERR, FIND_FAIL, NO_KILL);
}
}
return;
}
/*
* Die Funktion position() gibt für die
* Gadget-Tastatturabfrage die Position des Zeichens
* ch in der Zeichenkette itemcode[] zurück
*/
static int
position(int ch)
{
char *itemcode = "TLMPVAFRIWSHYD J";
/*
* Die Position des Zeichens errechnet sich aus der
* Differenz der Zeiger auf das gefundene Zeichen und
* dem auf die Zeichenkette itemcode
*/
int pos = (int)(strchr(itemcode, (int)ToUpper((ULONG) ch)) - itemcode);
return ((pos < 0) ? ~0 : pos);
}
/*
* In diesem Feld stehen nach dem Aufruf die
* erwarteten Parameter. Im Falle der verwendeten
* Schalter steht im entsprechenden Feld opts[i] ein
* TRUE oder FALSE, jenachdem, ob der Schalter beim
* Aufruf angegeben wurde oder nicht
*/
LONG opts[COUNT_FLAGS];
/*
* Diese Funktion parst die Kommandozeile und gibt
* die Nummer des entsprechenden Schalters zurück.
* Defaultmäßig wird 12 (Systeminfo) zurückgegeben
*/
static int
HandleArguments(char **str)
{
int ret = 12, j;
struct RDArgs *argsptr;
/*
* Die Kommandozeile wird geparst. Falls ein Fehler
* beim Parsen auftrat, wird das Programm mit einer
* Fehlermeldung verlassen
*/
if ((argsptr = ReadArgs(TEMPLATE, opts, NULL)) == NULL)
ErrorHandle("TemplateError", TASK_ERR, WRONG_FAIL, KILL);
else
{
/*
* Das Feld opts[] wird durchsucht, ob ein Flag
* gesetzt wurde. Falls eine gesetzte Option gefunden
* wurde, wird die Schleife abgebrochen und der
* entsprechende Rückgabewert gesetzt
*/
for (j = 0; j < COUNT_FLAGS; j++)
if (opts[j])
{
ret = j;
break;
}
/*
* Die Funktion ReadArgs() reserviert intern
* Speicherplatz für die Kommandoargumente. Dieser
* Platz muß dem System mit der Prozedur FreeArgs()
* zurückgegeben werden
*/
FreeArgs(argsptr);
}
return (ret);
}
/*
* Die Prozedur HandleIDPort() wird aufgerufen, wenn RSys
* ein zweites Mal gestartet wird. Wird dabei ein Parameter
* übergeben, so wird dieser mit dem Message-System des
* AmigaDOS an den ID-Port des bereitsgestarteten Programms
* versendet und hier ausgewertet. Die Struktur SysMsg
* enthält neben der Standard-System-Message noch die ID
* der anzuzeigenden Liste.
*/
static void
HandleIDPort(void)
{
SysMsg *arrived_mess;
int ID;
/*
* Es werden alle Nachrichten ausgewertet, solange, bis
* die Message-Queue leer ist.
*/
while (arrived_mess = (SysMsg *) GetMsg(SysIdPort))
{
ID = arrived_mess->sm_newtype;
ReplyMsg((struct Message *) arrived_mess);
/*
* Falls das RSys-Hauptfenster mit dem Zip-Gadget auf
* eine kleine Fenstergröße gebracht wurde, wird es
* jetzt nach vorne geholt und auf normale Größe
* gebracht.
*/
if (SysWnd->Flags & WFLG_ZOOMED)
{
WindowToFront(SysWnd);
ZipWindow(SysWnd);
}
/*
* In jedem Fall wird das RSys-Hauptfenster aktiviert.
*/
ActivateWindow(SysWnd);
/*
* Ist die erhaltene Nachricht von einem zweiten
* RSys-Aufruf ohne Parameter abgesendet worden, steht
* das ID-Feld der SysMsg-Struktur auf SYSTEMINFO.
* Falls ein Parameter angegeben wurde, wird die
* Anzeigeliste mit dem neuen Parameter aktualisiert
* und in der globalen Variablen LastID gemerkt.
*/
if (ID != SYSTEMINFO) RefreshList(LastID = ID);
/*
* Während der ID-Port abgefragt wird, kann das
* Hauptfenster Nachrichten empfangen haben. Diese
* sollen nach dem Empfang der Nachricht vom zweiten
* Programmaufruf nicht ausgewertet werden. Deshalb
* werden jetzt die evtl. vorhandenen Nachrichten des
* Hauptfenster-Ports gelöscht.
*/
ClearIntuiMsgPort(SysWnd);
}
return;
}
void
SetMainLVTop(int top)
{
GT_SetGadgetAttrs(SysGadgets[GD_ListeLV], SysWnd,
NULL,
GTLV_Top, top,
TAG_DONE);
return;
}
/*
* Die Procedure HandleRawKeys() wertet die
* Tastatureingaben des Hauptfensters aus. Dazu wird
* das Feld IntuiMessage->Code verwendet.
*/
static void
HandleRawKeys(ULONG code, ULONG qualifier)
{
/*
* Es werden bei einem Tastatur-Event zwei Messages
* an den Hauptfenster-Port versendet, wenn die Taste
* gedrückt und dann, wenn sie losgelassen wurde.
* Hier sollen nur die Events ausgewertet werden, die
* direkt nach dem Drücken einer Taste anliegen.
*/
if(code & IECODE_UP_PREFIX) return;
if(qualifier & CTRLKEYS) return;
switch (code)
{
/*
* Falls die "Cursor-Down"-Taste gedrückt wurde, wird
* der oberste Eintrag des ListViews aktualisiert und
* auf den nächsten Eintrag gesetzt, falls es nicht
* schon der letzte oberste Eintrag war. Der globale
* Zähler topentry wird dann um eins erhöht.
*/
case CURSORDOWN:
if (topentry < (countentries - newlvh))
{
topentry++;
SetMainLVTop(topentry);
actualfindnode = GetNode(&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
/*
* Falls die "Cursor-Up"-Taste gedrückt wurde, wird
* der oberste Eintrag des ListViews aktualisiert und
* auf den vorherigen Eintrag gesetzt, falls es nicht
* schon der erste Eintrag der Liste war. Der globale
* Zähler topentry wird dann um eins erniedrigt.
*/
case CURSORUP:
if (topentry > 0)
{
topentry--;
SetMainLVTop(topentry);
actualfindnode = GetNode(&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
/*
* Das ListView zeigt den Anfang der Liste. Der
* Zähler topentry wird auf Null gesetzt.
*/
case CURSORLEFT:
if (topentry != 0)
{
topentry = 0;
SetMainLVTop(topentry);
actualfindnode = GetNode(&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
/*
* Das ListView zeigt das Ende der Liste. Der
* Zähler topentry wird auf den Eintrag mit der
* Nummer (Anzahl der Einträge - Anzahl der
* sichtbaren Einträge) gesetzt.
*/
case CURSORRIGHT:
if (topentry != (countentries - newlvh))
{
topentry = (countentries - newlvh);
SetMainLVTop(topentry);
actualfindnode = GetNode(&ListeLVList, topentry);
actualfindnodenum = topentry;
}
break;
default:
/* PrintStatistics();*/
break;
}
return;
}
/*
* Die Funktion SelectGadget() simuliert den
* Gadget-Down-Klick eines Boolean-Gadgets.
*/
static void
SelectGadget(struct Gadget *Gadget)
{
UWORD oldpos;
/*
* Dazu wird das Gadget aus der Gadget-Liste
* entfernt, das SELECTED-Flag gesetzt und das Gadget
* wieder an der gleichen Position in die Liste
* eingehängt.
*/
oldpos = RemoveGadget(SysWnd, Gadget);
Gadget->Flags |= GFLG_SELECTED;
AddGadget(SysWnd, Gadget, (ULONG) oldpos);
/*
* Nun wird das Gadget wieder aktualisiert und ein
* wenig gewartet.
*/
RefreshGList(Gadget, SysWnd, NULL, 1);
return;
}
/*
* Die Funktion UnSelectGadget() simuliert den
* Gadget-Up-Klick eines Boolean-Gadgets.
*/
static void
UnSelectGadget(struct Gadget *Gadget)
{
UWORD oldpos;
/*
* Dazu wird das Gadget aus der Gadget-Liste
* entfernt, das SELECTED-Flag entfernt und das
* Gadget wieder an der gleichen Position in die
* Liste eingehängt.
*/
oldpos = RemoveGadget(SysWnd, Gadget);
Gadget->Flags &= ~GFLG_SELECTED;
AddGadget(SysWnd, Gadget, (ULONG) oldpos);
/*
* Nun wird das Gadget wieder aktualisiert.
*/
RefreshGList(Gadget, SysWnd, NULL, 1);
return;
}
/*
* Die Procedure HandleVanillaKeys() wertet die
* Tastatureingaben des Hauptfensters aus. Dazu wird
* das Feld IntuiMessage->Code verwendet.
*/
static void
HandleVanillaKeys(ULONG code, ULONG qualifier)
{
int ID;
if (qualifier & CTRLKEYS) return;
/*
* Wurde die Esc-Taste gedrückt, werden zwei Fälle
* unterschieden. Wurde RSys von der WB gestartet,
* geht RSys in den AppIcon-Modus, wurde es von einem
* CLI gestartet, wird RSys beendet, indem das globale
* Flag Flags.quit_flag gesetzt wird.
*/
if ((char)code == ESC && !Flags.wb_start)
{
Flags.quit_flag = 1;
return;
}
/*
* Wurde RSys mit dem Zip-Gadget verkleinert, werden
* keine Vanillakeys ausgewertet.
*/
if (SysWnd->Flags & WFLG_ZOOMED) return;
if((char)ToUpper(code) == 'N')
{
SelectGadget(SysGadgets[GD_NewGad]);
RefreshList(LastID);
UnSelectGadget(SysGadgets[GD_NewGad]);
return;
}
/*
* Nun wird die Listen-ID aus dem Code des Gadgets
* ermittelt, dessen entsprechende Taste gedrückt
* wurde.
*/
ID = position((int)code);
/*
* Entspricht die ID einer Gadget-ID, wird das
* entsprechende Gadget aktiviert und die
* entsprechende Aktion ausgeführt. Dabei wird die
* ID des aktuellen ListView-Inhalts in LastID
* gemerkt.
*/
if ((ID < GD_SaveListGad) && (ID != ~0))
{
HandleHelp((enum RSysNumbers)ID);
LastID = ID;
SelectGadget(SysGadgets[LastID]);
RefreshList(ID);
UnSelectGadget(SysGadgets[LastID]);
return;
}
/*
* Wurde das Jump-Gadget aktiviert, schließt RSys sein
* Hauptfenster und öffnet es auf dem vordersten
* PublicScreen.
*/
if (ID == GD_JumpGad)
{
Jump();
return;
}
/*
* Kommt das Programm bis hierhin, konnte der
* Tastenklick nicht erkannt werden. Es erfolgt eine
* entsprechende Nachricht im Message-Feld von RSys.
*/
PrintStatistics();
return;
}
/*
* Die Prozedur HandleGadgets() verarbeitet die
* Gadgetevents. Zu einem Parameter gad wird die
* entsprechende Aktion ausgelöst.
*/
static void
HandleGadgets(struct Gadget *gad)
{
char fileout[MAXFULLNAME];
int ID = (int)gad->GadgetID;
HandleHelp((enum RSysNumbers)ID);
if(ID == GD_NewGad)
{
RefreshList(LastID);
return;
}
/*
* Falls die ListView-Liste abgespeichert werden
* soll, wird ein Asl-Requester angeboten und die
* Liste in eine ausgewählte Datei als Textdatei
* weggeschrieben.
*/
if (ID == GD_SaveListGad)
{
sprintf(fileout, "RSys-%s.dat", EntryAttr[LastID].ea_type);
if (GetFile(SysWnd, "RAM:", fileout, "#?.dat", "Select File for saving list", "Save"))
SaveList(SysWnd, (char *)_fullpath, EntryAttr[LastID].ea_type, &ListeLVList, TRUE);
return;
}
/*
* Handelt es sich um die anderen Gadgets, wird
* entsprechend der GadgetID das ListView
* aktualisiert.
*/
if (ID < GD_SaveListGad)
{
LastID = ID;
RefreshList(ID);
return;
}
/*
* Wurde das Jump-Gadget aktiviert, schließt RSys sein
* Hauptfenster und öffnet es auf dem vordersten
* PublicScreen.
*/
if (ID == GD_JumpGad) Jump();
return;
}
/*
* Die Prozedur HandleMenu() verwaltet die
* Menu-Eingaben.
*/
static void
HandleMenu(ULONG code)
{
struct MenuItem *item;
USHORT nextcode = (USHORT) code;
void (*fptr) (void);
extern int ReopenWindow;
ReopenWindow = FALSE;
DPOS;
/*
* Falls ein Menüpunkt ausgewählt wurde, wird das
* entsprechende Menü-Item ermittelt. Aus dem
* UserData-Feld dieses Menüpunktes erhält man
* schließlich einen Zeiger auf die Funktion, die
* ausgeführt werden soll.
* Erweiterung: Werden mehrere Menüpunkte hintereinander
* angewählt, ohne das Menü zu desaktivieren, werden
* auch alle ausgewählt.
*/
while (nextcode != MENUNULL && !ReopenWindow)
{
if ((item = ItemAddress(SysMenus, (long)nextcode)) != NULL)
{
/*
* Falls das UserData-Feld initialisiert wurde, wird
* der dort eingetragene Zeiger als Zeiger auf eine
* auszuführende Funktion genommen und ausgeführt.
*/
if (fptr = GTMENUITEM_USERDATA(item))
(*fptr) ();
}
else break;
nextcode = item->NextSelect;
}
return;
}
/*
* HandleMainPort() bearbeitet die Nachrichten vom RSys-
* Hauptfenster und ruft die entsprechenden Unter-
* programme auf
*/
void
HandleMainPort(void)
{
register struct IntuiMessage *message;
ULONG class,
code,
qualifier;
APTR object;
static int refr = TRUE;
int GID;
static int oldh;
while ((message = (struct IntuiMessage *) GT_GetIMsg(SysWnd->UserPort)) != NULL)
{
/*
* Die wichtigsten Daten werden aus der erhaltenen
* Nachricht kopiert.
*/
object = message->IAddress;
class = message->Class;
code = message->Code;
qualifier = message->Qualifier;
/*
* Die Nachricht wird sofort beantwortet, damit
* Intuition nicht länger als notwendig auf eine
* Antwort wartet.
*/
GT_ReplyIMsg(message);
if(!Flags.helpmode && ICONIFY_REQUESTED)
{
Iconify();
ClearIntuiMsgPort(SysWnd);
return;
}
/*
* Entsprechend der Art (der Klasse) der Nachricht
* werden die Aktionen ausgeführt.
*/
switch (class)
{
/*
* Ist die Volumes-Liste im ListView aktiv und wurde
* ein Diskettenwechsel in den Laufwerken erkannt,
* wird die Liste automatisch aktualisiert.
*/
case IDCMP_DISKINSERTED:
case IDCMP_DISKREMOVED:
if (LastID == VOLUMES) RefreshList(LastID);
break;
/*
* Wurde eine Taste gedrückt, wird eine entsprechende
* Aktion gestartet. Falls ein Qualifier (also einer
* der Shift-, Amiga- und Control-Tasten oder eine
* Kombination von diesen) erkannt wurde, wird keine
* Aktion gestartet.
*/
case IDCMP_VANILLAKEY:
HandleVanillaKeys(code, qualifier);
break;
/*
* Wurde eine Taste oder Sondertaste gedrückt, wird
* eine entsprechende Aktion gestartet. Falls ein
* Qualifier (also einer der Shift-, Amiga- und
* Control-Tasten oder eine Kombination von diesen)
* erkannt wurde, wird keine Aktion gestartet.
*/
case RAWKEY:
HandleRawKeys(code, qualifier);
break;
/*
* Wird ein Gadget auf dem Hauptfenster angeklickt,
* wird eine entsprechende Aktion gestartet. Wurde
* das ListView angeklickt, wird versucht, den
* Eintrag zu modifizieren.
*/
case IDCMP_GADGETUP:
GID = ((struct Gadget *) object)->GadgetID;
if (GID == GD_ListeLV)
{
HandleHelp((enum RSysNumbers)GID);
ModifyObject(LastID, code);
}
else HandleGadgets((struct Gadget *) object);
break;
/*
* Wird das Hauptfenster gezipt, wird der Inhalt des
* Fensters und das Hintergrundmuster erneuert.
*/
case IDCMP_CHANGEWINDOW:
if (NOT(SysWnd->Flags & WFLG_ZOOMED))
{
/*
* Das Fenster soll nur EINMAL refreshed werden.
* Diese IDCMP-Message kommt aber auch dann, wenn ein
* Fenster verschoben wurde, weshalb ein Flag extra
* eingeführt wurde.
*/
if (NOT(refr))
{
RefreshMainWindowPattern();
refr = TRUE;
if (Flags.autofront)
{
WindowToFront(SysWnd);
ActivateWindow(SysWnd);
}
}
}
else refr = FALSE;
break;
case IDCMP_SIZEVERIFY:
oldh = SysWnd->Height;
break;
case IDCMP_NEWSIZE:
if((SysWnd->Height - oldh) != 0) ResizeWindowRefresh();
break;
/*
* Ein Menüpunkt wurde ausgewählt.
*/
case MENUPICK:
HandleMenu(code);
break;
/*
* Das Closegadget des Hauptfensters wurde geklickt.
* Nach einer Sicherheitsabfrage wird das Programm
* beendet.
*/
case IDCMP_CLOSEWINDOW:
quit(TRUE);
break;
default:
break;
}
}
return;
}
/*
* Das Hauptprogramm. Hier werden alle
* Intuition-Events abgeholt und die entsprechenden
* Auswerteprozeduren aufgerufen.
*/
void
main(int argc, char **argv)
{
ULONG mask;
DPOS;
/*
* Das Flag, daß die Beendung des Programms
* signalisiert wird initialisiert.
*/
Flags.quit_flag = 0;
InstallTrapHandlers();
/*
* Falls RSys vom CLI aus gestartet wurde, erscheint
* eine kleine Infozeile im CLI. Dann wird die
* globale Variable Flags.wb_start auf FALSE gesetzt, da
* das Programm in diesem Fall nicht von der WB aus
* gestartet wurde.
*/
if (argc)
{
PutStr((UBYTE *) &v[7]);
Flags.wb_start = 0;
}
else Flags.wb_start = 1;
/*
* Falls bei einem CLI-Aufruf Parameter mit angegeben
* wurden, werden diese ausgewertet.
*/
if (argc >= 2) LastID = HandleArguments(argv);
/*
* Es wird festgestellt, ob das Programm bereits
* gestartet wurde. Wurde es bereits gestartet, wird
* das Programm beendet. Dabei werden die evtl.
* angegebenen und verarbeiteten Parameter an das
* bereits laufende Programm verschickt.
*/
if (SysStarted(LastID)) CloseAll();
/*
* Alle notwendigen Ressourcen (Libraries, RSys-Ports
* etc.) werden eröffnet und bereitgestellt.
*/
OpenLibs();
/*
* Der ID-Port wird erzeugt. An der Existenz dieses
* Ports kann bei einem zweiten Aufruf des Programms
* festgestellt werden, ob RSys bereits gestartet
* wurde.
*/
if (!(SysIdPort = CreatePort(ID_PORT_NAME, 0)))
ErrorHandle((char *)ID_PORT_NAME, PORT_ERR, CREATE_FAIL, KILL);
/*
* Das ListView wird initialisiert.
*/
NewList(&ListeLVList);
/*
* Falls der Aufruf von der WB aus geschah, wird RSys
* "iconifiziert", d.h. ein AppIcon wird auf der
* WB erzeugt. Andernfalls wird das Hauptfenster
* geöffnet und entsprechend der Nummer LastID das
* ListView aktualisiert.
*/
if (Flags.wb_start) Iconify();
else
{
OpenMainWindow();
RefreshList(LastID);
}
/*
* Schleifenbeginn. Solange, bis ein
* Abbruchkriterium erkannt wurde (Flags.quit_flag ist
* TRUE), wird auf das Setzen der entsprechenden
* Flags gewartet.
*/
do
{
/*
* Warten auf folgende Events:
* - ^C wurde eingegeben
* - Events vom Hauptfenster
* - Events vom ID-Port
* - Events vom Broker-Port.
*/
mask = Wait(SIGBREAKF_CTRL_C |
(1L << SysWnd->UserPort->mp_SigBit) |
(1L << SysIdPort->mp_SigBit) |
(1L << broker_mp->mp_SigBit));
/*
* Falls ein ^C eingegeben wurde, wird das
* Programmbeendigungsflag gesetzt.
*/
if (CTRL_C_RECEIVED) Flags.quit_flag = 1;
/*
* Wenn das Programm ein zweitesmal aufgerufen wird,
* erhält der ID-Port eine Nachricht.
*/
if (ID_PORT_SIG_RECEIVED) HandleIDPort();
/*
* Falls von dem System-Programm Exchange ein Signal
* gesendet wurde, wird es hier verarbeitet.
*/
if (BROKER_PORT_SIG_RECEIVED) HandleBrokerPort();
/*
* Falls das Hauptfenster ein Signal erhalten hat,
* werden die Daten der Nachricht(en) gemerkt und
* weiterverarbeitet.
*/
if (WINDOW_PORT_SIG_RECEIVED) HandleMainPort();
}
/*
* Das Programm läuft solange, bis das Flags.quit_flag
* gesetzt wurde.
*/
while (NOT((Flags.quit_flag)));
/*
* Die geöffneten Resourcen werden geschlossen und
* das Programm beendet.
*/
CloseAll();
return;
}